/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

/**
 *
 * @author marcelo
 */
import cprincipal.Medicina;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class MedicinaXml 
{
    private Element root;
    private String fileLocation = "src/Archivos/medicinas.xml";

    public MedicinaXml()
    {
        try
        {
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        }
        catch (JDOMException ex)
        {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
        catch (IOException ex)
        {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

    private Element MedicinatoXmlElement(Medicina nMedicina)
    {
        Element Medicinatrans = new Element("medicina");

        Element nombreComercial = new Element("nombreComercial");
        nombreComercial.setText(nMedicina.getNombreComercial());
        Element nombreCientifico = new Element("nombreCientifico");
         nombreCientifico.setText(nMedicina.getNombreCientifico());
        Element componentes = new Element("componentes");
         componentes.setText(nMedicina.getComponentes());
        Element contraindicaciones = new Element("contraindicaciones");
        contraindicaciones.setText(nMedicina.getContraindicaciones());
        Element  cantidadDisponible = new Element ("cantidadDisponible");
         cantidadDisponible.setText(Integer.toString(nMedicina.getCantidadDisponible()));
        Element  fechaVencimiento = new Element ("fechaVencimiento");
          fechaVencimiento.setText(Integer.toString(nMedicina.getFechaVencimiento()));
        Element  fechaConsumo = new Element ("fechaConsumo");
         fechaConsumo.setText(Integer.toString(nMedicina.getFechaConsumo()));
        Element  precio = new Element ("precio");
         precio.setText(Integer.toString(nMedicina.getPrecio()));

        
        Medicinatrans.addContent(nombreComercial);
        Medicinatrans.addContent(nombreCientifico);
        Medicinatrans.addContent(componentes);
        Medicinatrans.addContent(contraindicaciones);
        Medicinatrans.addContent(cantidadDisponible);
        Medicinatrans.addContent(fechaVencimiento);
        Medicinatrans.addContent(fechaConsumo);
        Medicinatrans.addContent(precio);

        return Medicinatrans;
    }

      private Medicina MedicinaToObject(Element element) throws ParseException
      {
      Medicina nMedicina = new Medicina ();

      nMedicina.setNombreComercial(element.getChildText("nombreComercial"));
              nMedicina.setNombreCientifico(element.getChildText("nombreCientifico"));
             nMedicina.setComponentes(element.getChildText("componentes"));
             nMedicina.setContraindicaciones(element.getChildText("contraindicaciones"));
              nMedicina.setCantidadDisponible(Integer.parseInt(element.getChildText("cantidadDisponible")));
               nMedicina.setFechaVencimiento(Integer.parseInt(element.getChildText("fechaVencimiento")));
               nMedicina.setFechaConsumo(Integer.parseInt(element.getChildText("fechaConsumo")));
                nMedicina.setPrecio(Integer.parseInt(element.getChildText("precio")));

        return nMedicina;
    }

         public static Element buscar(List raiz, String dato) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("nombreComercial").getText())) {
                return e;
            }
        }
        return null;
    }


    private boolean updateDocument() {
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

    public boolean agregarMedicina(Medicina nMedicina) {
        boolean resultado = false;
        root.addContent(MedicinatoXmlElement(nMedicina));
        resultado = updateDocument();
        return resultado;
    }



 public Medicina buscarMedicina(String dato) {
        Element aux = new Element("medicina");
        List Medicinas = this.root.getChildren("medicina");

        while (aux != null) {
            aux = MedicinaXml.buscar(Medicinas, dato);
            if (aux != null) {
                try {
                    return MedicinaToObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }

  public boolean actualizarMedicina(Medicina nMedicina) {
        boolean resultado = false;
        Element aux = new Element("medicina");
        List Medicinas = this.root.getChildren("medicina");
        while (aux != null) {
            aux = MedicinaXml.buscar(Medicinas, nMedicina.getNombreComercial());
            if (aux != null) {
                Medicinas.remove(aux);
                resultado = updateDocument();
            }
        }
        agregarMedicina(nMedicina);
        return resultado;
    }

   public boolean borrarMedicina(String dato) {
        boolean resultado = false;
        Element aux = new Element("medicina");
        List Medicinas = this.root.getChildren("medicina");
        while (aux != null) {
            aux = MedicinaXml.buscar(Medicinas, dato);
            if (aux != null) {
                Medicinas.remove(aux);
                resultado = updateDocument();
            }
        }
        return resultado;
    }

     public ArrayList<Medicina> todasLasMedicinas() {
        ArrayList<Medicina> resultado = new ArrayList<Medicina>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(MedicinaToObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}

